package com.ki.erp.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;


@Component
public class SpringBeanUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(@NonNull ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    /**
     * 通过Bean名称获取Bean（非泛型版本）
     *
     * @param beanName Bean名称（支持别名）
     * @return Bean实例
     * @throws NoSuchBeanDefinitionException 如果Bean不存在
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName) {
        return (T) applicationContext.getBean(beanName);
    }

    /**
     * 通过类型获取唯一Bean
     *
     * @param clazz Bean类型
     * @param <T>   泛型类型
     * @return Bean实例
     * @throws NoUniqueBeanDefinitionException 如果存在多个同类型Bean
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    /**
     * 通过名称和类型获取Bean（推荐组合方式）
     *
     * @param beanName Bean名称
     * @param clazz    Bean类型
     * @param <T>      泛型类型
     * @return Bean实例
     * @throws NoSuchBeanDefinitionException 如果Bean不存在或类型不匹配
     */
    public static <T> T getBean(String beanName, Class<T> clazz) {
        return applicationContext.getBean(beanName, clazz);
    }

    // 可选：带默认值的安全获取方法
    public static <T> T getBeanOrDefault(String beanName, Class<T> clazz, T defaultValue) {
        if (applicationContext.containsBean(beanName)) {
            return getBean(beanName, clazz);
        }
        return defaultValue;
    }
}